﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AllInOne.Dados;
using AllInOne.Util;

namespace AllInOne.Negocio
{
    /// <summary>
    /// Classe para abstração da interação com o banco de dados
    /// </summary>
    class NegocioOrcamento : Negocio<Orcamento>
    {
        #region Negocio<Orcamento> Constructor

        public NegocioOrcamento()
        {

        }

        #endregion


        #region Negocio<Orcamento> Members

        /// <summary>
        /// Persiste um objeto 'Orcamento'
        /// </summary>
        /// <param name="objeto">Orcamento a ser persistido</param>
        /// <returns>Id do item persistido</returns>
        public int adicionar(Orcamento objeto)
        {
            int retorno = -1;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    mdc.AddToOrcamentoSet(objeto);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        retorno = objeto.Id;
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }
            return retorno;
        }


        /// <summary>
        /// Atualiza o item atual, caso esteja atualmente persistido
        /// </summary>
        /// <param name="objeto">Objeto a atualizar no banco de dados</param>
        /// <returns><code>true</code>- Atualizado com sucesso, <code>false</code>- Erro ao persistir</returns>
        public bool atualizar(Orcamento objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Object original;

                if (mdc.TryGetObjectByKey(objeto.EntityKey, out original))
                {
                    mdc.ApplyCurrentValues(objeto.EntityKey.EntitySetName, objeto);
                }

                int result = mdc.SaveChanges();

                if (result > 0)
                    retorno = true;
            }
            return retorno;
        }


        /// <summary>
        /// Exclui um item do banco de dados
        /// </summary>
        /// <param name="objeto">Objeto a excluir</param>
        /// <returns><code>true</code>- Excluído com sucesso, <code>false</code>- Erro ao exlcuir</returns>
        public bool remover(Orcamento objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Orcamento tmp = mdc.GetObjectByKey(objeto.EntityKey) as Orcamento;

                if (tmp != null)
                {
                    mdc.OrcamentoSet.DeleteObject(tmp);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        return true;
                }
            }
            return retorno;
        }


        /// <summary>
        /// Recupera a lista de Servicos atualmente persistidos
        /// </summary>
        /// <returns>Servicos atualmente persistidos no banco de dados</returns>
        public List<Orcamento> pesquisar()
        {
            List<Orcamento> retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.OrcamentoSet.ToList<Orcamento>();
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }


        /// <summary>
        /// Retorna o serviço com o id especifidado
        /// </summary>
        /// <param name="id">Id para pesquisa</param>
        /// <returns><code>Orcamento</code> localizado ou <code>null</code> caso não localizado</returns>
        public Orcamento pesquisar(int id)
        {
            Orcamento retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.OrcamentoSet.First<Orcamento>(orcamento => orcamento.Id == id);
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }

        #endregion
    }
}
